// 前端 roles 控制菜单权限 通过登录后的角色对菜单就行过滤处理
// 如果需要前端 roles 控制菜单权限 请使用此文件代码替换 permission.ts 的内容

import { defineStore } from 'pinia';
import { RouteRecordRaw } from 'vue-router';

import router, { allRoutes } from '@/router';
import { store } from '@/store';

function filterPermissionsRouters(routes: Array<RouteRecordRaw>, roles: Array<unknown>) {
  const res: Array<RouteRecordRaw> = [];
  const removeRoutes: Array<RouteRecordRaw> = [];
  routes.forEach((route) => {
    const children: Array<RouteRecordRaw> = [];
    route.children?.forEach((childRouter) => {
      const roleCode = childRouter?.meta?.roleCode || childRouter?.name;
      if (roles?.indexOf?.(roleCode) !== -1) {
        children?.push?.(childRouter);
      } else {
        removeRoutes?.push?.(childRouter);
      }
    });
    if (children?.length > 0) {
      route.children = children;
      res?.push?.(route);
    }
  });
  return { accessedRouters: res, removeRoutes };
}

export const usePermissionStore = defineStore?.('permission', {
  state: () => ({
    whiteListRouters: ['/login'],
    routers: [],
    removeRoutes: [],
  }),
  actions: {
    async initRoutes(roles: Array<unknown>) {
      let accessedRouters = [];

      let removeRoutes: Array<RouteRecordRaw> = [];
      // special token
      if (roles?.includes?.('all')) {
        accessedRouters = allRoutes;
      } else {
        const res = filterPermissionsRouters?.(allRoutes, roles);
        accessedRouters = res?.accessedRouters;
        removeRoutes = res?.removeRoutes;
      }

      this.routers = accessedRouters;
      this.removeRoutes = removeRoutes;

      removeRoutes?.forEach?.((item: RouteRecordRaw) => {
        if (router?.hasRoute?.(item?.name)) {
          router?.removeRoute?.(item?.name);
        }
      });
    },
    async restore() {
      this?.removeRoutes?.forEach?.((item: RouteRecordRaw) => {
        router?.addRoute?.(item);
      });
    },
  },
});

export function getPermissionStore() {
  return usePermissionStore?.(store);
}
